#include <iostream>
#include <cstdbool>
#include "stack_seq.h"
 
using namespace std;
 
template <class T>
SeqStack<T>::SeqStack(int sz) 
{
    // 构造函数，建立一个空栈
    top = -1;
    maxSize = sz;
    elements = new T[maxSize]; // 创建栈的数组空间
    if(elements == NULL) {
        cerr << "内存空间分配失败！" << endl;
        exit(1);
    }
}
 
template <class T>
SeqStack<T>::~SeqStack()
{
    // 析构函数
    delete []elements;
}
 
template <class T>
void SeqStack<T>::overflowProcess()
 {
    // 栈的溢出处理
    T *newArray = new T[maxSize + stackIncreament];
    if(newArray == NULL) {
        cerr << "存储空间分配失败！" << endl;
        exit(1);
    }
    // 将elements数组中的值复制到新数组中
    for(int i = 0; i <= top; i++)
        newArray[i] = elements[i];
    maxSize = maxSize + stackIncreament;
    delete []elements;
    elements = newArray; // 复制数组
}
 
template <class T>
void SeqStack<T>::Push(const T x) 
{
    // 把x插入到栈顶,如果栈满，进行溢出处理
    if(isFull() == true) // 栈满则溢出处理
        overflowProcess();
    elements[++top] = x; // top自增1，并存储x
}
 
template <class T>
bool SeqStack<T>::Pop()
 {
    // 如果栈为空，不进行出栈，否则把栈顶元素出栈
    if(isEmpty()) // 判断栈空否，若空则返回false
        return false;
    top--; // 栈顶减1，相当于把这个栈顶元素删掉
    return true;
}
 
template <class T>
bool SeqStack<T>::getTop(T &x)const 
{
    // 返回栈顶元素的值
    if(isEmpty()) // 判断栈空否，若空则返回false
        return false;
    x = elements[top]; // 返回栈顶元素的值
    return true;
}
 
template <class T>
bool SeqStack<T>::isEmpty()const 
{
   // 判断栈是否为空
    if(top == -1)
        return true;
    return false;
}
 
template <class T>
bool SeqStack<T>::isFull()const 
{
    // 判断栈是否为空
    if(top == maxSize-1)
        return true;
    return false;
}
 
template <class T>
int SeqStack<T>::getSize()const
 { // 返回栈中元素的个数
    return top+1;
}
 
template <class T>
void SeqStack<T>::clear() 
{
    // 清空栈的内容
    top = -1; // 将top赋值-1，相当于清空数组内容
}
 
template <class T>
ostream& operator<<(ostream &out, SeqStack<T> &s) // 友元函数
{ 
    // 输出栈中元素的重载操作
    out << "top=" << s.top << endl; // 输出栈顶位置
    for(int i = 0; i <= s.top; i++) // 逐个输出栈中元素的值
        out << i << ":" << s.elements[i] << endl;
    return out;
}

